package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blog.cmrpersonalblog.dto.sensitiveword.requset.SensitiveWordQueryRequest;
import com.blog.cmrpersonalblog.dto.sensitiveword.respnose.SensitiveWordResponse;
import com.blog.cmrpersonalblog.entity.SensitiveWord;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 敏感词Mapper接口
 */
public interface SensitiveWordMapper extends BaseMapper<SensitiveWord> {

    /**
     * 分页查询敏感词列表
     * @param page 分页参数
     * @param query 查询条件
     * @return 敏感词分页列表
     */
    IPage<SensitiveWordResponse> selectSensitiveWordPage(Page<SensitiveWordResponse> page, @Param("query") SensitiveWordQueryRequest query);

    /**
     * 根据敏感词内容查询
     * @param word 敏感词内容
     * @return 敏感词信息
     */
    SensitiveWord selectByWord(@Param("word") String word);

    /**
     * 批量插入敏感词
     * @param sensitiveWords 敏感词列表
     * @return 插入数量
     */
    int batchInsert(@Param("list") List<SensitiveWord> sensitiveWords);

    /**
     * 批量更新敏感词状态
     * @param ids 敏感词ID列表
     * @param status 状态
     * @param updateBy 更新人ID
     * @return 更新数量
     */
    int batchUpdateStatus(@Param("ids") List<Long> ids, @Param("status") Integer status, @Param("updateBy") Long updateBy);

    /**
     * 批量删除敏感词
     * @param ids 敏感词ID列表
     * @return 删除数量
     */
    int batchDelete(@Param("ids") List<Long> ids);

    /**
     * 根据类型查询敏感词
     * @param type 敏感词类型
     * @param status 状态（可选）
     * @return 敏感词列表
     */
    List<SensitiveWord> selectByType(@Param("type") String type, @Param("status") Integer status);

    /**
     * 获取所有启用的敏感词
     * @return 敏感词列表
     */
    List<SensitiveWord> selectAllEnabled();

    /**
     * 更新敏感词匹配统计
     * @param word 敏感词内容
     * @return 更新数量
     */
    int updateMatchCount(@Param("word") String word);

    /**
     * 获取敏感词统计信息
     * @return 统计信息
     */
    Map<String, Object> selectStatistics();

    /**
     * 获取敏感词类型分布
     * @return 类型分布
     */
    List<Map<String, Object>> selectTypeDistribution();

    /**
     * 获取敏感词严重程度分布
     * @return 严重程度分布
     */
    List<Map<String, Object>> selectSeverityDistribution();

    /**
     * 获取敏感词过滤模式分布
     * @return 过滤模式分布
     */
    List<Map<String, Object>> selectFilterModeDistribution();

    /**
     * 检查敏感词是否存在
     * @param word 敏感词内容
     * @param excludeId 排除的ID
     * @return 存在数量
     */
    int countByWord(@Param("word") String word, @Param("excludeId") Long excludeId);

    /**
     * 获取热门敏感词（按匹配次数排序）
     * @param limit 限制数量
     * @return 热门敏感词列表
     */
    List<SensitiveWordResponse> selectPopularWords(@Param("limit") Integer limit);

    /**
     * 清理过期的匹配统计
     * @param days 保留天数
     * @return 清理数量
     */
    int cleanExpiredStats(@Param("days") Integer days);
}